package cn.pupil.springframework.beans.factory.config;

import cn.pupil.springframework.beans.PropertyValues;

/**
 * @Description: Bean定义，用于定义Bean实例化信息
 * @Author: pupil
 * @Date: 2024/10/08 下午 7:54
 */
public class BeanDefinition {

    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;

    // Bean的作用范围——原型
    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

    // Bean的class对象
    private Class beanClass;

    // 属性集合
    private PropertyValues propertyValues;

    // 初始化方法名
    private String initMethodName;

    // 销毁方法名
    private String destroyMethodName;

    // Bean的作用范围，默认单例
    private String scope = SCOPE_SINGLETON;

    // 单例标记
    private boolean singleton = true;

    // 原型标记
    private boolean prototype = false;

    public BeanDefinition(Class beanClass) {
        this(beanClass, null);
    }

    public BeanDefinition(Class beanClass, PropertyValues propertyValues) {
        this.beanClass = beanClass;
        this.propertyValues = propertyValues != null ? propertyValues : new PropertyValues();
    }

    /**
     * 判断是否是单例
     *
     * @return
     */
    public boolean isSingleton() {
        return singleton;
    }

    /**
     * 判断是否是原型
     *
     * @return
     */
    public boolean isPrototype() {
        return prototype;
    }

    /**
     * 在xml注册Bean定义时，通过scope字段来判断是单例还是原型
     *
     * @param scope
     */
    public void setScope(String scope) {
        this.scope = scope;
        this.singleton = SCOPE_SINGLETON.equals(scope);
        this.prototype = SCOPE_PROTOTYPE.equals(scope);
    }

    /**
     * 获取Bean的作用范围
     *
     * @return
     */
    public String getScope() {
        return scope;
    }

    /**
     * 获取 Bean
     *
     * @return
     */
    public Class getBeanClass() {
        return beanClass;
    }

    /**
     * 设置 Bean
     *
     * @param beanClass Bean的class对象
     */
    public void setBeanClass(Class beanClass) {
        this.beanClass = beanClass;
    }

    /**
     * 获取属性集合
     *
     * @return
     */
    public PropertyValues getPropertyValues() {
        return propertyValues;
    }

    /**
     * 设置属性集合
     *
     * @param propertyValues 属性集合
     */
    public void setPropertyValues(PropertyValues propertyValues) {
        this.propertyValues = propertyValues;
    }


    /**
     * 获取初始化方法名
     *
     * @return
     */
    public String getInitMethodName() {
        return initMethodName;
    }

    /**
     * 设置初始化方法名
     *
     * @param initMethodName 初始化方法名
     */
    public void setInitMethodName(String initMethodName) {
        this.initMethodName = initMethodName;
    }

    /**
     * 获取销毁方法名
     *
     * @return
     */
    public String getDestroyMethodName() {
        return destroyMethodName;
    }

    /**
     * 设置销毁方法名
     *
     * @param destroyMethodName 销毁方法名
     */
    public void setDestroyMethodName(String destroyMethodName) {
        this.destroyMethodName = destroyMethodName;
    }
}
